; v1.01 bate

#Requires AutoHotkey v2.0
#Include SimLog.ahk
#Include CSV_Pcr.ahk
#Include Application.ahk

class StarupManagement {

    __New() {

        ; 配置文件位置
        this.config := A_WorkingDir . "\StartupManagement.ini"

        ; 日志对象
        this.logger := SimLog(SimLog.PATH_FDL . "StartupManagement.log")
        this.logger.emptyLine()
        this.logger.info("启动")

        ; ----- Config -----

        ; 应用程序使用系统启动文件夹(Applications use startup folder)
        this.AUSF := IniRead(this.config, "Config", "AUSF", "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\Startup")

        ; 启动列表
        this.startupList := []

        ; 启动目录
        this.startupDir := IniRead(this.config, "Config", "startupDir", "")

        ; 启动应用程序
        this.runApplication()

        this.logger.info("正常执行，退出")

    }

    _prepare() {

        ; 添加应用到启动列表(从startupList.csv文件中)
        this._readToStartupListCSV()

        ; 添加应用到启动列表(从启动目录中)
        Loop Files, this.startupDir . "\*", "FR" {

            ; 封装一层
            app := Application(A_LoopFileFullPath, 0, "", "")

            ; 判断应用是否已经在启动列表存在(如果存在则不添加)
            loop this.startupList.Length {
                if(this.startupList[A_Index].path == app.path){
                    continue
                }
            }

            ; 添加到启动列表
            this.startupList.Push(app)

        }

        ; 排序
        this._sortStartupList()

        this.logger.info(Format("准备工作: 完成,{1}个应用待执行", this.startupList.Length))

    }

    ; 添加应用到启动列表(从startupList.csv文件中)
    _readToStartupListCSV() {

        ; 读文件
        t := FileTool()
        txt := t.read(A_WorkingDir . "\StartupList.csv")
        c := CSV_Pcr()
        c.load(txt)

        ; 添加到启动列表
        loop c.content.Length {

            ; 跳过第一行数据
            if (A_Index == 1) {
                continue
            }

            app := Application(c.getCell(A_Index, 1), c.getCell(A_Index, 2), c.getCell(A_Index, 3), c.getCell(A_Index, 4))
            this.startupList.Push(app)
        }
       

    }

    ; 排序数组
    _sortStartupList() {

        this.logger.info("准备工作: 应用执行顺序排序")

        ; 使用选择排序
        i := 1
        while (i < this.startupList.Length) {

            j := i + 1
            while (j <= this.startupList.Length) {
                if (this.startupList[i].priority < this.startupList[j].priority) {
                    temp := this.startupList[i]
                    this.startupList[i] := this.startupList[j]
                    this.startupList[j] := temp
                }
                j++
            }

            i++
        }

    }

    runApplication() {
        this._prepare()

        loop this.startupList.Length {

            ; 拼接 程序 + 运行参数
            script := Format("{} {}", this.startupList[A_Index].path, this.startupList[A_Index].param)

            this.logger.info(Format('执行: "{1}"', script))
            ; 尝试运行
            RunWait(script)

        }
    }

}